我正在使用Spring MVC实现一个Web应用程序。在我的应用程序中,我需要实现一个通知服务。这是通知的数据库表。

    CREATE TABLE `notification` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`),
  `message` varchar(100),
  `dateAndTime` time DEFAULT NULL,
  `read` tinyint(1) NOT NULL DEFAULT '0',
  `notificationType` int(11) DEFAULT NULL,
  `userId` bigint(20),
  FOREIGN KEY (`userId`) REFERENCES `application_user` (`id`)
);


这里的userId是发送通知的用户的ID。这可以是单个用户或多个用户。这取决于notificationType的值。这是我为此编写的域模式。

@Entity
@Table(name = "notification")
public class Notification {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
private Long id;

private String message;

@DateTimeFormat(pattern = "yy-MM-dd-hh-mm")
private Date dateAndTime;

private boolean read;

public static enum NotificationType{
    SINGLE_USER, MULTIPLE_USER
}

//@OneToMany
//@JoinColumn(name="type")
//private User user;

ApplicationUser applicationUser;

private NotificationType notificationType = NotificationType.SINGLE_USER;
......


我不清楚如何在此处实现一对多关系。我希望mysql查询在上述条件下是准确的。请帮我解决一下这个。

编辑:

如果NotificationType = SINGLE_USER,我只需要将通知发送给一个用户。如果NotificationType = MULTIPLE_USER,则需要将通知发送给多个用户。

最佳答案

在表模式中,您定义了多对一关系。

@ManyToOne
@JoinColumn(name="userId")
private User user;



  如果NotificationType = SINGLE_USER,我只需要将通知发送给一个用户。如果NotificationType = MULTIPLE_USER,则需要将通知发送给多个用户。


在这种情况下,您应该创建另一个结构。

例如

CREATE USER (
    ...,
    notification_id,
    ...
)

class Notification {
    @OneToMany
    @JoinColumn(name="notification_id")
    private User user;
}


或者,您可以创建新表,该表将仅保存notification_id和user_id:

CREATE USER_NOTIFICATION (
    user_id,
    notification_id
)


接着

class Notification {
     @ManyToMany
     @JoinTable(
         name="USER_NOTIFICATION",
         joinColumns=@JoinColumn(name="USER_ID", referencedColumnName="ID"),
         inverseJoinColumns=@JoinColumn(name="NOTIFICATION_ID",
         referencedColumnName="ID"))
  private List<User> users;
}



  如何将此数据与NotificationType连接?


您在通知表中具有列类型。您如何发送通知-这是您的业务逻辑。您不需要为此做任何表结构。如果您愿意,可以创建触发器,该触发器将检查在USER_NOTIFICATION中插入新(notification_id,user_id)的逻辑。

10-08 20:14