Hibernate 使用外键字段的最佳实践

Hibernate 使用外键字段的最佳实践,hibernate,Hibernate,我有两张桌子,单词和状态, State包含2个col、ID和CurrentState,它的3个静态行是1-Active、2-InActive和3-Other Word是我要添加行的表。它有4个列,ID、Value、Description和CurrentState。 它在列currentState上有一个要声明的外键 下面是我的工作代码,它创建一个单词,设置它的currentState字段并将其持久化 Word word = new Word(); word.setValue("someWord

我有两张桌子,单词和状态, State包含2个col、ID和CurrentState,它的3个静态行是1-Active、2-InActive和3-Other Word是我要添加行的表。它有4个列,ID、Value、Description和CurrentState。 它在列currentState上有一个要声明的外键 下面是我的工作代码,它创建一个单词,设置它的currentState字段并将其持久化

Word word = new Word(); 
word.setValue("someWord");
word.setDescription("some description for this word");      
State state = new State(1,"Active");
word.setState(state);   
worddao.saveOrUpdate(word);

问题是这看起来不太对劲。创建State实例的最佳实践是什么,这样我就可以创建一个指向有效State行的单词。这里是否有枚举选项?我的意思是我可能会意外地创建一个ID为5的状态,并违反外键约束。我首先要防止这种情况发生。有什么想法吗?

安全的方法是查找state对象,而不是创建一个新对象。您可以将实体标记为可缓存,也可以将要检索状态的查询标记为可缓存,以避免不必要的查询

Word word = new Word(); 
word.setValue("someWord");
word.setDescription("some description for this word");      
State state = stateDao.findByState("Active")
word.setState(state);   
worddao.saveOrUpdate(word);
主/参考数据表的另一个选项(我通常遵循)是没有数字ID。只需有一列作为它的字符串表示,并将其用作外键列

这样做的好处是,当您查看数据库中的数据(即单词表)时,状态将很容易解释。你不必再做一次心理检查来理解数据

另一个优点是缓存变得更容易。我们只需要缓存实体,而不是查询,因为查找总是按主键进行的


以后如果需要,您可以添加另一列作为显示标签。

安全的方法是查找状态对象,而不是创建新的状态对象。您可以将实体标记为可缓存,也可以将要检索状态的查询标记为可缓存,以避免不必要的查询

Word word = new Word(); 
word.setValue("someWord");
word.setDescription("some description for this word");      
State state = stateDao.findByState("Active")
word.setState(state);   
worddao.saveOrUpdate(word);
主/参考数据表的另一个选项(我通常遵循)是没有数字ID。只需有一列作为它的字符串表示,并将其用作外键列

这样做的好处是,当您查看数据库中的数据(即单词表)时,状态将很容易解释。你不必再做一次心理检查来理解数据

另一个优点是缓存变得更容易。我们只需要缓存实体,而不是查询,因为查找总是按主键进行的


稍后,如果需要,您可以添加另一列作为显示标签。

Yes枚举是一个选项!请看,枚举是一个很好的选择,但添加新值需要更多的努力。如果已经有不同值的条件代码,则这不是问题。是枚举是一个选项!请看,枚举是一个很好的选择,但添加新值需要更多的努力。如果已经有不同值的条件代码,这不是问题。干杯,这就是我的意思,我担心如果每次只是查询数据库以获取有效状态值列表,这将导致不必要的查询。缓存表听起来像是我需要的,Cheers,这就是我想要的,我担心如果每次只是查询数据库以获取有效状态值列表,这将导致不必要的查询。缓存桌子听起来像是我需要的,干杯