2017-06-05 103 views
0

我正在使用Spring MVC和Hibernate开始一个项目。我很关心与班级构成有关的最佳做法。假设我有一个名为User的类,并使用像Hibernate这样的ORM技术。Java Spring MVC + Hibernate类组合

我不知道是否应该包括所有与用户类内的用户实体相关的。我知道Hibernate通过延迟加载自动提高了性能,因此当我们检索用户时它不会检索所有实例变量。不过,我觉得如果我们在U​​ser类中包含了太多的变量,查询User对象将变得非常昂贵。

考虑这个例子:

@Entity 
@Table(name = "Users") 
public class User{ 

private String username; 
private String password; 
private long user_id; 

private Collection<Transaction> transactions; 

} 

在这里,用户类存储交易的集合。每笔交易都代表用户在网站上进行的购买交易。但我们不需要为每个用户存储一个交易集合。

相反,我们可以做一个交易表所示:

@Entity 
@Table(name = "UserTransactions) 
public class Transaction{ 

    private int user_id; 
    private int order_id; 
    private double amount_paid; 
} 

通过此次交易表中,我们仍然可以存储每一笔交易的每个用户作出。

这只是一个例子,还有很多变量不需要存储在User类中,并可以用自己的表来表示。所以我想知道在User类中是否存在所有这些变量的损害,或者我们是否应该小心并选择包含在User类中的东西?每种方法的优缺点是什么?

预先感谢您!

+0

你想问什么?如何创建hibernate实体之间的关系? –

回答

2

看来你有用户和UserTransation之间的一个一对多的关系。一个用户可以有很多交易,一个交易只有一个用户。

所以我不明白你为什么想知道,如果你要存储在用户的一切。你不能。您必须拥有2个域对象User和UserTransaction,并具有一对多关系(在数据库中具有User和(User)Transaction表)。然后,当你用Hibernate查询一个用户时,默认情况下使用“lazy-loading”不与一个Transaction进行连接。对于需要Transaction的数据访问模式,明确地进行“fetch连接”,以便在单个SQL查询中获取用户及其事务。

1

如果您不想存储在数据库中的所有变量,那么你可以使用

@Column(insertable=false, updatable=false) or @transient 

,并使用交易表将是一个比较好的方法只有TRANSACTION_ID和user_ID的是有限制他们和休息所有用户详细信息您可以在一些其他的表存储,因为它会更加有组织和标准化,将导致更少的开销