具有相同集合的ElementCollection

时间:2014-08-08 21:39:12

标签: java sql hibernate annotations

我想存储在表中发生更改时需要通知的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列不能为空。

2 个答案:

答案 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也可以使用本机查询来完成,但是在这里你必须考虑已经存在的数据,所以它有点困难。