`

Enterprise JavaBean3.0 (第5版)

阅读更多

1. 实体关系

    1.1 单向One-to-One (Customer 1-1 Address)

        Public class Customer implements Serializable {

            private Address homeAddress;

            @OneToOne(cascade={CascadeType.ALL})    //cascade可以不写

            @JoinColumn(name="ADRDRESS_ID")    //JoinColumn可以不写

            或者使用@PrimaryKeyJoinColumn来代替上一行

            public Address getAddress() { return homeAddress; }

            public void setAddress(Address address) { this.homeAddress = address; }

        }

    1.2 双向One-to-One (Customer 1-1 CreditCard)

        Public class Customer implements Serializable {

            private CreditCard creditCard;

            @OneToOne(cascade={CascadeType.ALL})    //cascade可以不写

            @JoinColumn(name="CREDIT_CARD_ID")    //JoinColumn可以不写

            public CreditCard getCreditCard() { return creditCard; }

            public void setCreditCard(CreditCard creditCard) { this.creditCard = creditCard; }

        }

        Public class CreditCard implements Serializable {

            private Customer customer;

            @OneToOne(mappedBy="creditCard")  

            public Customer getCustomer() { return customer; }

            public void setCustomer(Customer customer) { this.customer = customer; }

        }

        创建实例

        Customer cust = new Customer();

        CreditCard card = new CreditCard();

        cust.setCreditCard(card);

        card.setCustomer(cust);

        em.persist(cust);

        删除实例

        Customer cust = em.find(Customer.class, id);

        em.remove(cust.getCreditCard());

        cust.setCreditCard(null);    

    1.3 单向One-to-Many (Customer 1-N Phone)

        Public class Customer implements Serializable {

            private Collection<Phone> phoneNumbers = new ArrayList<Phone>();

            @OneToMany(cascade={CascadeType.ALL})    //cascade可以不写

            @JoinColumn(name="CUSTOMER_ID")    //JoinColumn可以不写

            public Collection<Phone> getPhoneNumbers() {return phoneNumbers;}

            public void setPhoneNumbers(Collection<Phone> phoneNumbers) {this.phoneNumbers = phoneNumbers;}

        }

        另外可以使用关系表映射

        Public class Customer implements Serializable {

            private Collection<Phone> phoneNumbers = new ArrayList<Phone>();

            @OneToMany(cascade={CascadeType.ALL})    //cascade可以不写

            @JoinTable(name="CUSTOMER_PHONE",

                            

    2.8 Native SQL

        String sqlstr = "SELECT p.phone_PK, p.phone_number FROM Phone p";

        em.createNativeQuery(sqlstr, Phone.class);

    2.9 具名查询

        预定义好EJB QL或者Native SQL

        @NamedQueries(

            @NamedQuery(name="getCustomer", query="SELECT c FROM Customer where c.firstName=?1"),

            @NamedQuery(name="findCustomer", query="SELECT c FROM Customer")

        )

        em.createNamedQuery("getCustomer");

        query.setParameter(1, "Charles");

3. 回调和监听器

    3.1 回调

        PrePersist, PostPersist, PostLoad, PreUpdate, PostUpdate, PreRemove, PostRemove

        @PrePersist void beforeInsert() {}

        定义一系列方法,可以在执行具体的操作之前或者之后,加入相应的方法

    3.2 监听器

        如果我们定义了一个Class方法,其中有很多PrePersist之类的方法,那么在执行Entity的时候,

        我们可以注册成Listeners,以实现其中的调用方法,主要是拦截Entity生命周期的事件

        @Entity

        @EntityListeners({TitanAuditLogger.class, EntityJmxNotifier.class})

        public class Cabin {}

        在Cabin执行Persist操作时,相应TitanAuditLogger中的方法就会被调用

        子类能继承基类的监听器,如果两者都定义,那么子类都会用到

4. Session Bean

    4.1 两种调用方式

        1. call-by-value: 远程接口,无论客户端是在同一JVM还是远程,EJB容器都对参数和返回值进行值拷贝

        2. call-by-reference: 本地接口,不会值拷贝

评论

相关推荐

Global site tag (gtag.js) - Google Analytics