Hibernate-аннотации - вопрос об отношениях один ко многим с составным первичным ключом - PullRequest
0 голосов
/ 28 февраля 2011

Прежде всего, пожалуйста, посмотрите на мой дизайн,

У меня есть две таблицы T1 (a, b, c, d) - это первичный ключ T2 (a, e) где (a, e) - составной первичный ключ a - внешний ключ, ссылающийся на T1 (a)

T1 - отношения T2 один ко многим.

Итак, я создал три класса

  1. С1 для Т1 Имеет пять полей - a, b, c, d, c2Set с сеттерами и геттерами

  2. C2 для T2 Он имеет два поля - c1, c3 типа C1, C3 соответственно - с сеттерами и геттерами

  3. C3 Я определяю C3 для представления составного первичного ключа T2 Имеет два поля (a, e) с сеттерами и геттерами

Я использую следующие аннотации для определения отображений гибернации в классах C1, C2, C3 соответственно

1.

@Entity
@Table(name = "T1", schema = "dbo", uniqueConstraints = { @UniqueConstraint(columnNames = "a") })

@Id
@Column(name = "a", unique = true, nullable = false)

@Transient
private Set<C2> c2Set = new HashSet<C2>();

@OneToMany(fetch = FetchType.EAGER, mappedBy = "c1")
    public Set<C2> getC2Set() {
        return c2Set;
    }

2

@Entity     
@Table(name="T2", schema = "dbo") 

@Id
public C3 getC3() {
        return c3;
    }

private C1 c1;
@ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "a",insertable= false, updatable=false)
    public C1 getC1() {
        return c1;
    }

3

@Embeddable

@Column(name = "a")
    public String getA() {
        return a;
    }

@Column(name="e")
    public String getE() {
        return e;
    }


@Service
public class C1ServiceImpl implements C1Service {

    @Autowired
    @Qualifier("transactionProxy")
    private GenericDAO genericDAO;


    public GenericDAO getGenericDAO() {
        return genericDAO;
    }

    public void setGenericDAO(GenericDAO genericDAO) {
        this.genericDAO = genericDAO;
    }


    @Override
    public void registerC1() {

        C1 c1=new C1();
        c1.setA("aValue");
                c1.setB("someValue");
                c1.setC("someValue");
                c1.setD("someValue");

        C3 compositeKey1 = new C3();
        compositeKey1.setA("aValue");
        compositeKey1.setE("e1");

                C3 compositeKey2 = new C3();
        compositeKey1.setA("aValue");
        compositeKey1.setE("e2");


        C2 c2_1=new C2();
        c2_1.setC3(compositeKey1);

                C2 c2_2=new C2();
        c2_2.setC3(compositeKey2);




        Set<C2> eSet = new HashSet<C2>();
        eSet.add(c2_1);
        eSet.add(c2_2);

        c1.setRoles(eSet);----------------------Important

        genericDAO.registerUser(c1);
    }       

    }





@Repository
@Transactional
public class HibernateDAO implements GenericDAO {

    @Autowired
    private SessionFactory sessionFactory;

    public SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    private Session currentSession() {
        return sessionFactory.getCurrentSession();
    }

    @Override
    public void registerC1(C1 c1) {
        Session session = currentSession();
        session.beginTransaction();
        session.save(c1);----------------------------------------- Here I feel insertion should happen in both T1 & T2 tables. What should I should I do, should I insert into T2 in                                                                            the same way as I am doing for T1 
        session.getTransaction().commit();

    }




}



<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
        <property name="url"
            value="XXXXXXXXXXXXXXXXXXXXXXX" />
        <property name="username" value="dddddd" />
        <property name="password" value="eeeeee" />
    </bean>
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="packagesToScan" value="<package in which C1,C2,C3,Generic DAO, HibernateDAO live>" />
        <property name="annotatedClasses">
     <list>
       <value>Fully qualified name of C1</value>
     </list>
   </property>

        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.current_session_context_class">thread</prop>
                <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory
                </prop>
                <prop key="dialect">org.hibernate.dialect.SQLServerDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
            </props>
        </property>
    </bean>

    <bean id="myTxManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    <bean id="transactionProxy"
        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        <property name="proxyTargetClass" value="true" />
        <property name="transactionManager">
            <ref bean="myTxManager" />
        </property>
        <property name="transactionAttributes">
            <props>
                <prop key="*">PROPAGATION_REQUIRED</prop>
            </props>
        </property>
        <property name="target">
            <bean class="fully qualified name of HibernateDAO">
                <property name="sessionFactory" ref="sessionFactory" />
        </bean>
        </property>
    </bean>

У меня проблема при вставке (сохранении) данных. Данные в T1 вставляются, но в T2 не происходит вставка (что, я думаю, должно происходить здесь автоматически)? Пожалуйста, скажите мне, где я делаю вещи неправильно. И я хочу узнать больше о Hibernate Аннотации. Может кто-нибудь указать мне некоторые полезные онлайн-ресурсы.

И хорошо ли отделять компонент формы от класса сущности? Пожалуйста, скажите мне, где я могу узнать о

1 Ответ

0 голосов
/ 28 февраля 2011

Hibernate не сохраняет объекты, на которые ссылаются отношения по умолчанию. Вам нужно настроить каскадирование отношений, чтобы Hibernate делал это:

@OneToMany(fetch = FetchType.EAGER, mappedBy = "c1", cascade = CascadeType.ALL)
public Set<C2> getC2Set() {
    return c2Set;
} 

Смотри также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...