@RequestMapping(path = "create", params = "complete", method = RequestMethod.POST) public String createComplete(SessionStatus sessionStatus) { sessionStatus.setComplete(); return "account/createComplete" }
SessionStatusのsetCompleteメソッドを呼び出す。
@RequestMapping(path = "create", params = "complete", method = RequestMethod.POST) public String createComplete(SessionStatus sessionStatus) { sessionStatus.setComplete(); return "account/createComplete" }
SessionStatusのsetCompleteメソッドを呼び出す。
会社でActive Directoryを使用しているんですが、パスワード変更するのが非常に面倒くさい。。。
VMでWindows起動して、パスワード変更だなんて。たったこれだけの作業のために時間使いたくないと思い、スクリプト作っちゃいました。
#!/bin/bash echo -n "ユーザ名を入力してください。 > "; read NAME; read -sp "古いパスワードを入力してください。 > " OLD_PASSWD; echo read -sp "新しいパスワードを入力してください。 > " NEW_PASSWD; echo read -sp "新しいパスワードを入力してください。(確認用) > " NEW_PASSWD_RE; echo if [ ${NEW_PASSWD} != ${NEW_PASSWD_RE} ]; then echo "### 新しいパスワードが一致しません。 ###"; exit 1; fi sudo dscl /Active\ Directory/[ドメイン名]/All\ Domains/ -passwd /Users/${NAME} ${OLD_PASSWD} ${NEW_PASSWD} 1>/dev/null 2>/dev/null; RESULT=$?; if [ ${RESULT} = 0 ]; then echo "### パスワードが変更されました。 ###"; elif [ ${RESULT} = 11 ]; then echo "### パスワードの変更に失敗しました。 ###"; exit 11; elif [ ${RESULT} = 185 ]; then echo "### ユーザが存在しません。###"; exit 185; else echo "### パスワードの変更に失敗しました。 ###"; exit 1; fi
※[ドメイン名]のところはよしなに変更してください!
スクリプト起動してユーザ名、旧パスワード、新パスワード、新パスワード(再)を順に入力するだけです!
以下のコマンドで確認できます。パスワードを入力して「>」が表示されれば成功です。
sudo dscl -u [ユーザ名] /Active\ Directory/[ドメイン名]/All\ Domains/
データベースへのクエリのタイミングを定義するとき、大きく分けて2つ方式がある。
□Lazy
@OneToMany(mappedBy = "product", cascade = CascadeType.ALL, fetch = FetchType.LAZY) private List<OrderDetails> orderDetailses = new ArrayList<>();
□Eager
@OneToMany(mappedBy = "product", cascade = CascadeType.ALL, fetch = FetchType.EAGER) private List<OrderDetails> orderDetailses = new ArrayList<>();
□関連とFetchの設定
@OneToMany, @ManyToManyのデフォルトのFetch設定はLAZY
@ManyToOne, @OneToOneのデフォルトのFetch設定はEAGER
※Eager設定は、基本的にパフォーマンスのボトルネックとなるので、極力避ける
1対多については、単方向・双方向・JoinTableの3つの方式がある。
□単方向
OrdersオブジェクトからProductオブジェクトに対してのみアクセスする状態
public class Orders implements Serializable { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Integer ordersId; @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "orders_id") private Set<Product> products = new HashSet<>(); }
□双方向
双方向関連は、@OneToManyと@ManyToOneの両方のアノテーションが併用されている状態
public class Orders implements Serializable { @OneToMany(cascade = CascadeType.ALL, mappedBy = "orders") private List<Product> products = new ArrayList<>(); }
public class Product implements Serializable { @ManyToOne(optional = false) private Orders orders; }
この表記では、mappedByというパラメータを持つOrdersが被所有者側となる。
□1対多の双方向関連:JoinTable
1対多の双方向関連で間に結合テーブルを挟む場合は@JoinTableを使う
public class Orders implements Serializable { @OneToMany(cascade = CascadeType.ALL) @JoinTable(name = "orders_product") private List<Product> products = new ArrayList<>(); }
orders_productという結合テーブルが生成される。
カスケードは、関連しあうEntityに対して行われた処理を伝播させることができる。
例えば、単方向の1対1を考えるとき、オブジェクト上でCategoryインスタンスを保存した場合は、関連するSubCategoryのインスタンスの保存が自動で行われる。
□PERSIST処理
public class Category { @OneToOne(cascade = CascadeType.PERSIST) private SubCategory subCategory; }
□REMOVE処理
public class Category { @OneToOne(cascade = {CascadeType.PERSIST, CascadeType.REMOVE}) private SubCategory subCategory; }
もしくは、
public class Category { @OneToOne(cascade = {CascadeType.PERSIST, orphanRemoval = true}) private SubCategory subCategory; }
Hibernateでの結合テーブルの自動生成
@JoinTable(name = "category_subcategory", joinColumns = @JoinColumn(name = "category_id"), inverseJoinColumns = @JoinColumn(name = "subcategory_id")) private SubCategory subCategory;