2017-05-31 73 views
0

我使用弹簧启动(1.5.2.RELEASE)与休眠芯(5.2.9.Final)多冬眠@Id在基地和子

说明我有两个班(getter方法,setter方法,构造函数为dB(3列USERS表,并用6列USERS_HISTORY)中省略)和适当的表

public class User implements Serializable { 
    private static final long serialVersionUID = 1L; 

    private Long id; 
    private String firstName; 
    private String lastName; 
    } 

    public class UserHistory extends User implements Serializable { 
    private static final long serialVersionUID = 1L; 

    private Long hstId; 
    private Instant hstTimestamp; 
    private String changedBy; 
    } 

如何可以注释User.id和UserHistory.hstId既与@Id注释?

我不能仅注释User.id,因为一个用户在历史表中可以有多行。

当我调用userRepository.findOne(Long id)我想选择用User行与User.id,并且当我调用userHistoryRepository.findOne(长hstId)时,我想选择与UserHistory.hstId UserHistory行。

UserHistoryRepository和UserRepository都扩展Spring Data JPA CrudRepository。

我目前的解决方案基于三个类,但我试图找到仅基于两个类的解决方案。

我目前的解决办法是这样的:

public class UserBase implements Serializable { 
    private static final long serialVersionUID = 1L; 

    private String firstName; 
    private String lastName; 
    } 

    public class User extends UserBase implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    Long id; 
    } 

    public class UserHistory extends UserBase implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    private Long hstId; 
    private Instant hstTimestamp; 
    private String changedBy; 
    private Long id; 

    //constructor sets this.id = User.id 
    public UserHistory(Long hstId, Instant hstTimestamp, String changedBy, User user) { 
     //other lines omitted 
     this.id = user.id; 
    } 
    } 

回答

0

在不应该延长User你的情况UserHistory

使用One to Many的关系,因为一个用户可以在历史表

+0

喜多行,UserHistory必须扩展用户。我正在使用UserHistory对象和相应的表作为审计表,类似于Hibernate中的Envers,但更具可读性(获取所有用户历史记录,我可以调用select * from USERS_HISTORY where id = user.id)。就像我可以看到在某个用户对象上所做的每个更改。 –

+0

只要相信我,所有你需要的是一对多的关系 –