我正在使用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)的逻辑。