我已经在我的程序中休眠了注释类。因为我正在运行一个Spring项目,所以我将它们包含在servlet.xml文件中(com.student.dto是实际的包名)并在Contacts Entity上添加了@Component ..有没有办法自动添加@Component在所有的hibernate类中。每次我创建一个模型,我最终都会这样做,觉得应该有更好的做法。
<context:component-scan base-package="com.student.dto" />
@Component
@Entity
@Table(name = "Contacts", catalog = "javadb")
public class ContactsDTO implements java.io.Serializable {
private int idContacts;
private StudentDTO StudentDTO;
private String addr1;
private String addr2;
private String city;
private String state;
private String pinCode;
private String country;
private String phone;
private String mobile;
private String email;
private String contactscol;
public ContactsDTO() {
}
public ContactsDTO(int idContacts) {
this.idContacts = idContacts;
}
public ContactsDTO(int idContacts, StudentDTO StudentDTO, String addr1,
String addr2, String city, String state, String pinCode,
String country, String phone, String mobile, String email,
String contactscol) {
this.idContacts = idContacts;
this.StudentDTO = StudentDTO;
this.addr1 = addr1;
this.addr2 = addr2;
this.city = city;
this.state = state;
this.pinCode = pinCode;
this.country = country;
this.phone = phone;
this.mobile = mobile;
this.email = email;
this.contactscol = contactscol;
}
getters & setters
答案 0 :(得分:3)
你做错了。 Spring Beans默认是单例,你的实体不是线程安全的,它们都不应该是。
实体应该是绑定到持久上下文的局部变量。它们不应在多线程环境中访问。
并发控制为handled by the database,您的应用程序逻辑应主要关注preventing lost updates到application-level repeatable reads。
您的DAO和服务应该是Spring单例组件。您的实体和请求绑定的DTO永远不应该是单身。这些对象是短暂的,并且作用于生成它们的请求。
查看Spring Data JPA文档,了解可靠的数据访问层设计。
答案 1 :(得分:1)
@Component javadocs说这个。
表示带注释的类是“组件”。当使用基于注释的配置和类路径扫描时,这些类被视为自动检测的候选者。
@ Component,@ Repository等通常用于自动扫描(在应用程序引导期间)和依赖注入。我没有看到将您的实体作为Spring组件的重点。实体的典型用法是它代表您的Relational数据库表。实体(Java)=表(RDBMS)。这是实体的定义
实体是轻量级持久性域对象。通常,实体表示关系数据库中的表,并且每个实体实例对应于该表中的行。实体的主要编程工件是实体类,尽管实体可以使用辅助类。
包含您的实体的方式应该是这样的:
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
<prop key="hibernate.jdbc.batch_size">${hibernate.jdbc.batch_size}</prop>
</props>
</property>
<property name="annotatedClasses">
<list>
<!-- Here are your Entities annotated with @Entity -->
</list>
</bean>
请注意,您还可以定义名为“annotatedPackages”的属性并定义您的包 就个人而言,我还没有测试过“annotatedPackages”。但是,“annotatedClasses”工作得很好。 正如@Vlad Mihalcea所建议的那样,实体并不是单身人士。它们更像是“本地”范围,并且每个“请求”都是初始化的。
答案 2 :(得分:0)
您可以按惯例进行配置。在servlet.xml中,您可以添加一个执行类路径扫描的bean,并可以使用正则表达式和通用命名方法自动添加@Component。有关详细信息,请参见此处:
http://www.mkyong.com/spring/spring-filtering-components-in-auto-scanning/