JPA多对一关系

时间:2012-03-14 05:58:41

标签: jpa

我是JPA的初学者,需要一些帮助来获取JPA中的“多对一”关系。

我有以下实体。

存储所有用户信息的用户。用户扩展了Audiatable抽象类,用于保存auidt参数,如上次修改日期,创建日期等。

我正在尝试将其他字段添加为 lastUpdatedByUser ,该字段应该从 lastUpdatedBy 中获取,我正在尝试添加Many-One关系。 但这种关系在某种程度上没有起作用,我在这里做错了吗?

AuditableEntity.java

public abstract class AuditableEntity<T extends Entity<T, ID>, ID> implements Auditable {

private static final long serialVersionUID = 1L;

@Column(name = "cruserid")
private Long createdBy;


@Column(name = "crdate")
@Type(type = JpaConstants.TYPE_LOCAL_DATE_TIME)
private LocalDateTime createdOn;

@Column(name = "chuserid")
private Long lastUpdatedBy;

@Column(name = "chdate")
@Type(type = JpaConstants.TYPE_LOCAL_DATE_TIME)
private LocalDateTime lastUpdatedOn;

@Transient
@ManyToOne(fetch = FetchType.LAZY, targetEntity = User.class)
@JoinColumn(name = "usrId", referencedColumnName = "chuserid")
private User lastUpdatedByUser;

User.java

public class User extends AuditableEntity<User, Long> {
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "usrId")
private Long id;

@Column(name = "usrName")
private String name;

@Column(name = "loginame")
private String loginName;

}

1 个答案:

答案 0 :(得分:3)

好吧,你用@Transient标记了关联,这意味着该字段不是持久的,应该被JPA忽略。

您似乎还有两个不同的字段来存储相同的信息:lastUpdatedBylastUpdateByUser。删除第一个,并将第二个映射为

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "chuserid")
private User lastUpdatedByUser;

这表明该关联是User实体的ManyToOne(不需要指定targetEntity,因为它是字段的类型),并且该关联由可审计实体中名为“chuserid”的连接列实现。表,并引用User实体的ID(referencedColumnName仅在使用复合ID时有用,或者当您通过作为ID的列引用实体时)