不应该是家,窝更适合一点

发布新日志

  • @ManyToOne 

    2011-08-02 13:11:35

    @ManyToOne注解的这端,是多端

    1.在注释@ManyToOne(cascade=CascadeType.REFRESH,optional=true)中将属性optional设置为true,这可以使得即使外键为空时仍可以向表中添加数据。

    2.假设Person和Book是一对多的关系,其中Person的成员变量为:

    private Integer personId;

    private String name;

    private Short age;

    private List<Book> bookList=new ArrayList<Book>();

    对应在MySql中表的结构为:Person(personId,name,age),不必有bookList一项,在getBookList上方通过注释: @OneToMany(mappedBy="person",cascade=CascadeType.ALL)

    @OrderBy(value="bookId ASC")

    与Book关系形成一对多的关系。Book的成员变量是:

    private int bookId;

    private String title;

    private double price;

    private Person person;

    对应在MySql中表的结构为:Book(bookId,title,price,personId),注意要有Person表的主键personId,这样在插入记录时才不会产生异常。在getPerson上方有注释:

    @ManyToOne(cascade=CascadeType.REFRESH,optional=true)

    @JoinColumn(name="personId")

    与@OneToMany形成呼应。

    在EJB3.0 规范中 多对一与一对多的双向关系, 多对一(就是@ManyToOne注解的这端,是多端哦不要搞混了)这端总是双向关联端的主题(owner)端, 而一对多端的关联注解为 @OneToMany(mappedBy=" " )其值是:多对一端的属性

    demo:

    被动方:其实也就是一方 或者说(OneToMany方)

    @Entity
    public class Customer extends AbstractEntity {

    private String name;

    @OneToMany(mappedBy="customer",cascade=CascadeType.ALL)
    private Set<Order> orders;

    public void addOrder(Order order){
    if(orders == null){
    rders = new HashSet<Order>();
    }
    orders.add(order);
    }

    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    public Set<Order> getOrders() {
    return orders;
    }
    public void setOrders(Set<Order> orders) {
    this.orders = orders;
    }

    }

    主动方:1.关系的维护方2.ManyToOne方3.多方

    @Entity
    @Table(name="orders")
    public class Order extends AbstractEntity {

    private String name;

    @ManyToOne(cascade=CascadeType.ALL)
    private Customer customer;

    public Customer getCustomer() {
    return customer;
    }

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

    public String getName() {
    return name;
    }

    public void setName(String name) {
    this.name = name;
    }
    }

    以上是实体

    下面是测试用列哦

    public void testCRUD() {
    // 第一种情况: 调用的被动方的Dao 绑定主动方关系,但主动方没有绑定被动方
    Customer entity = new Customer();
    entity.setName("customer1");
    Order rder = new Order();
    order.setName("order1");
    entity.addOrder(order);
    entity = customerDao.create(entity); // 这种情况下 orders.customer_id == null
    //控制台的信息
    //Hibernate: insert into Customer (name, id) values (?, ?)
    //这里的customer_id 为null
    //Hibernate: insert into orders (name, customer_id, id) values (?, ?, ?)
    System.out.println("entity id = " + entity.getId());
    System.out.println("order id = "+ order.getId());
    System.out.println("1111********************** over");

    // 第二种情况: 调用的被动方的Dao 绑定主动方关系,并且主动方也绑定被动方
    entity = new Customer();
    entity.setName("customer2");
    rder = new Order();
    order.setName("order2");
    entity.addOrder(order);
    order.setCustomer(entity); //这里进行双向关联
    entity = customerDao.create(entity);
    //
    //Hibernate: insert into Customer (name, id) values (?, ?)
    //这里的customer_id 有值哦
    //Hibernate: insert into orders (name, customer_id, id) values (?, ?, ?)
    System.out.println("entity id = " + entity.getId());
    System.out.println("order id = "+ order.getId());
    System.out.println("2222********************** over");
    // 第三种情况: 调用的主动方的Dao 绑定被动方关系,但是被东方不绑定主动方
    entity = new Customer();
    entity.setName("customer3");
    rder = new Order();
    order.setName("order3");
    order.setCustomer(entity); //绑定被动方
    orderDao.create(order);
    //Hibernate: insert into Customer (name, id) values (?, ?)
    //Hibernate: insert into orders (name, customer_id, id) values (?, ?, ?)
    System.out.println("entity id = " + entity.getId());
    System.out.println("order id = "+ order.getId());
    System.out.println("3333********************** over");

    // 第四种情况: 调用的主动方的Dao 绑定被动方关系,并且被东方也绑定主动方
    entity = new Customer();
    entity.setName("customer4");
    rder = new Order();
    order.setName("order4");
    order.setCustomer(entity); //绑定被动方
    orderDao.create(order);
    System.out.println("entity id = " + entity.getId());
    System.out.println("order id = "+ order.getId());
    System.out.println("4444********************** over");
    //Hibernate: insert into Customer (name, id) values (?, ?)
    //Hibernate: insert into orders (name, customer_id, id) values (?, ?, ?)

    //总结:经测验二三四种方法结果都是一样都能持久化到数据库,并且关系也建立好了
    // 也就说只要主动方绑定了被动方关系就维护好了
    }

    *****************************************做级联删除测试************************************************************

    public void testCascade(){

    //1. 做个级联删除吧 测试删除主动方是否删除关联方
    // 这里会级联删除主动方的关联对象,以及该关联对象(被动方)所关联的所有主动方都会被级联删除
    orderDao.delete("order_id_1");
    //Hibernate: delete from orders where id=?
    // Hibernate: delete from orders where id=?
    // Hibernate: delete from orders where id=?
    // Hibernate: delete from orders where id=?
    // Hibernate: delete from orders where id=?
    // Hibernate: delete from Customer where id=?
    assertNull( orderDao.findById("orderDao"));

    //2. 做个级联删除吧 测试删除被动方是否删除关联方
    //删除该被动方,以及所关联的所有主动方(维护关系方or多方)与上面的调用主动方的结果一样
    //Hibernate: delete from orders where id=?
    // Hibernate: delete from orders where id=?
    // Hibernate: delete from orders where id=?
    // Hibernate: delete from orders where id=?
    // Hibernate: delete from orders where id=?
    // Hibernate: delete from Customer where id=?
    customerDao.delete("2");
    assertNull( customerDao.findById("2"));

    }

  • Java接口,抽象类,内部类

    2010-04-29 19:27:41

    最近看到论坛里有个帖子在讨论接口和抽象类的区别和作用,这其实也是很多面试官喜欢问的问题,这里我就说说我的总结,顺便说说内部类的作用,当是给刚入门,或者想学习java的同学们能更好的理解它们的用法。

    1.接口(interface),接口被用来建立类与类之间关联的标准。
    Java code
    public interface ITest{ public void test(); } public class TestImpl implements ITest{ public void test(){ System.out.println("test"); } }

    2.抽象类(abstract class),只要类中有一个抽象方法,此类就被标记为抽象类。实际上抽象类除了被继承之外没有任何意义。

    区别
    1.
    接口是公开(public)的,里面不能有私有的方法或变量,是用于让别人使用的,实现接口的一定要实现接口里定义的所有方法。
    而抽象类是可以有私有方法或私有变量的,实现抽象类可以有选择地重写需要用到的方法,但是必须实现里面所有的抽象方法。
    2.
    抽象类在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。
    但是,一个类却可以实现多个interface(java中实现多重继承的方法之一)。
    3.
    抽象类中可以有自己的数据成员,也可以有非abstarct的成员方法。
    而在接口中,只能够有静态的不能被修改的数据成员(也就是必须是 static final的,不过在 interface中一般不定义数据成员),而且所有的成员方法都是抽象的。
    4.
    抽象类和接口所反映出的设计理念不同。
    其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。(组合是"has a"关系)
    5.
    接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。
    抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。

    一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。不是很建议具体类直接实现接口的。还有一种设计模式是面向接口编程,而非面向实现编程。

    其实接口是抽象类的延伸,可以将它看做是纯粹的抽象类,就是说接口比抽象类还抽象,还有设计接口的目的就是为了实现C++中的多重继承,不过java团队设计的一样更有趣的东西来实现这个功能,那就是内部类(inner class)。

    内部类(inner class)
    Java code
    public class OuterClass{//外部类 private class InnerClass{}//内部类 }


    一.定义
    放在一个类的内部的类我们就叫内部类。
    二.作用
    1.内部类可以很好的实现隐藏,也就是封装性。一般的非内部类,是不允许有 private 与protected权限的,但内部类可以
    2.内部类拥有外围类的所有元素的访问权限
    3.可是实现多重继承(这个特点非常重要,个人认为它是内部类存在的最大理由之一)
    4.可以避免修改接口而实现同一个类中两种同名方法的调用
    三.多重继承的实现

    类一   
    Java code
    public class Example1 { public String getName() { return "luffyke" ; } }
      

    类二   
    Java code
    public class Example2 { public int getAge() { return 25 ; } }


    类三



     
    Java code
    public class MainExample { public class Test1 extends Example1 { public String getName() { return super.getName(); } } public class Test2 extends Example2 { public int getAge() { return super.getAge(); } } public String showName() { return new Test1().getName(); } public int showAge() { return new Test2().getAge(); } public static void main(String args[]) { MainExample example = new MainExample(); System.out.println("姓名:" + example.showName()); System.out.println("年龄:" + example.showAge()); } }


    大家注意看类三,里面分别实现了两个内部类 Test1,和Test2 ,Test1类又继承了Example1,Test2继承了Example2,这样我们的类三MainExample就拥有了Example1和 Example2的方法和属性,也就间接地实现了多继承。
Open Toolbar