我想存储在表中发生更改时需要通知的emailIds
。
我只有一个包含列ownerid和emailid的表。我想将emailid
存储在单独的行中,而不是以逗号分隔的列表。我不需要所有者表,因为我没有所有者的任何其他信息。我只是想保存emailid,但是要分成不同的行。
我如何在休眠状态下执行此操作。
我尝试过使用类似的东西
@Table(name = "OwnerEmailIds")
@Entity
public class OwnerEmailIds implements Serializable {
private static final long serialVersionUID = 5906661729869048121L;
@Column(name = "OwnerID", nullable = false)
private String ownerId;
@ElementCollection(fetch=FetchType.EAGER) // must use eager as we close the session before returning
@CollectionTable(name="OwnerEmailIds", joinColumns=@JoinColumn(name="vendorId"))
@Column(name = "emailId")
private Set<String> EmailIds = new HashSet<String>();
但问题是我的收集表与实体表相同。
由于我的emailIds列不为null,当我尝试保存对象时,它失败并显示sql错误,说明emailid列不能为空。
答案 0 :(得分:0)
我认为你要求的是将收集放在多行并重复其他值,在这种情况下,将插入电子邮件列表,并为其电子邮件重复owner_id。
Hibernate没有提供任何配置。你必须手动完成。
您可以使用以下结构和代码执行您要查找的内容。您必须拥有主键,在这里您可以将您的电子邮件ID作为主键,或者您可以添加自动增量整数ID。
@Table(name = "OwnerEmailIds")
@Entity
public class OwnerEmailIds implements Serializable {
private static final long serialVersionUID = 5906661729869048121L;
@Column(name = "OwnerID", nullable = false)
private String ownerId;
@Id
@Column(name = "emailId")
private String emailId;
//setter and getters
}
然后,您遍历电子邮件ID列表并创建以下对象,然后单独保存它们。您无法创建集合对象并将hibernate配置为将它们存储在多行的当前表中。
//loop throught the list of email ids
OwnerEmailIds oei = new OwnerEmailIds();
oei.setOwnerId("first last name");
oei.setEmailId("some@somedomain.com");
session.save(oei);
如果您将emailId作为主键,那么您必须确保没有两个所有者拥有相同的电子邮件ID。如果是这种情况,则必须添加另一个auto_increment主键。
答案 1 :(得分:0)
为了能够将实体映射到表,Hibernate需要一个唯一的id属性,该属性映射到表上的唯一(主)键。
正如您所说,如果您没有这个,并且这是您的应用程序使用的唯一表,那么Hibernate可能不是最佳选择。
您仍然可以通过执行本机SQL查询从数据库中通过Hibernate获取所需信息:
SQLQuery q = session.createSQLQuery("select OwnerID from OwnerEmailIds where emailId = :email");
q.setScalar("OwnerID", StandardBasicTypes.LONG);
q.setParameter("email", emailId)
List<Long> ids = (List<Long>) q.list();
存储id也可以使用本机查询来完成,但是在这里你必须考虑已经存在的数据,所以它有点困难。