@Component Hibernate类

时间:2014-11-22 19:22:12

标签: java spring hibernate jpa entity

我已经在我的程序中休眠了注释类。因为我正在运行一个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

3 个答案:

答案 0 :(得分:3)

你做错了。 Spring Beans默认是单例,你的实体不是线程安全的,它们都不应该是。

实体应该是绑定到持久上下文的局部变量。它们不应在多线程环境中访问。

并发控制为handled by the database,您的应用程序逻辑应主要关注preventing lost updatesapplication-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/